/**
 * 
 */
package gwtool.backend.updater;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;

import javax.swing.JOptionPane;

/**
 * 
 * Diese Klasse sorgt dafür, dass der autoUpdater aktuell bleibt.
 * 
 * @author Christian
 * @since 5.1.1
 */
public class UpdaterDownloader extends Thread {

	/**
	 * 
	 */
	private String onlineMd5Hash = "";

	/**
	 * 
	 */
	private static File localPath = new File(System.getProperty("user.home") + "/gwtool/autoupdater.jar");

	/**
	 * 
	 */
	private URL updateUrl = null;

	/**
	 * 
	 */
	private CommUtilities updateUtilities = null;

	/**
	 * Startet den Updater als neuen Thread
	 */
	public UpdaterDownloader() {

		updateUtilities = new CommUtilities();
	}

	/**
	 * Diese Methode verwaltet das Update des heldenUpdaters
	 */
	@Override
	public void run() {

		try {
			getAktuelleVersion();
			if (updateUrl == null) {
				return;
			}
			if (!updateUtilities.checkDateiMd5(localPath).equals(onlineMd5Hash)) {
				update();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Diese Methode holt die aktuellen Daten vom Server.
	 * 
	 * @throws Exception
	 *             Es werden alle Exceptions weitergeworfen und in der
	 *             Runmethode behandelt.
	 */
	private void getAktuelleVersion() throws Exception {

		URL url = new URL(updateUtilities.getServerUrlUpdater() + "index.php?pw=autoUpdater");
		int count = 0;
		while (count <= 3 && (updateUrl == null || onlineMd5Hash.equals(""))) {
			Scanner scanner = new Scanner(url.openStream());
			while (scanner.hasNext()) {
				String part = scanner.nextLine();
				if (part.startsWith("UpdatePath=")) {
					updateUrl = new URL(part.substring("UpdatePath=".length(), part.length()));
				}
				if (part.startsWith("MD5=")) {
					onlineMd5Hash = part.substring("Md5=".length(), part.length());
				}
			}
			count++;
			if (count >= 3) {
				throw new IOException("Server liefert Müll");
			}
			scanner.close();
		}
	}

	/**
	 * Diese Methode führt das Update aus.
	 * 
	 * @throws Exception
	 *             Es werden alle Exceptions weitergeworfen und in der
	 *             Runmethode behandelt.
	 */
	private void update() throws Exception {

		if (localPath.isDirectory()) {
			localPath.delete();
		}
		if (!localPath.exists()) {
			localPath.createNewFile();
		}
		if (localPath.exists() && localPath.canWrite()) {
			File tempFile = null;
			try {
				String path = localPath.getAbsolutePath();
				// Umbennen
				tempFile = new File(path + ".temp");
				tempFile.createNewFile();
				InputStream inStream = updateUrl.openStream();
				BufferedInputStream in = new BufferedInputStream(inStream);
				FileOutputStream fos = new FileOutputStream(tempFile);
				BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
				byte[] buffer = new byte[1024];
				int len;
				while ((len = in.read(buffer)) != -1) {
					bout.write(buffer, 0, len);
				}
				bout.flush();
				bout.close();
				in.close();
				fos.close();
				if (updateUtilities.checkDateiMd5(tempFile).equals(onlineMd5Hash)) {
					localPath.delete();
					tempFile.renameTo(localPath);
					System.out.println("Download erfolgreich");
				} else {
					throw new Exception("Download fehler");
				}
			} catch (Exception e) {
				tempFile.delete();
				if (new KopierWerkzeug().getFileSize(localPath) == 0) {
					localPath.delete();
				}
				throw e;
			}
		} else {
			JOptionPane.showMessageDialog(null, "Der Autoupdater konnte, aufgrund fehlender Schreibrechte"
					+ " im PluginOrdner, nicht installiert werden.", "Keine Schreibrechte", JOptionPane.ERROR_MESSAGE);
			// HeldenOut.println("localPath) " + localPath.getAbsolutePath(),
			// HeldenOut.CHRISTIAN);
			// HeldenOut.println("localPath.exists() " + localPath.exists(),
			// HeldenOut.CHRISTIAN);
			// HeldenOut.println("localPath.isFile() " + localPath.isFile(),
			// HeldenOut.CHRISTIAN);
			// HeldenOut.println("localPath.canWrite() " + localPath.canWrite(),
			// HeldenOut.CHRISTIAN);
			throw new IOException("Dateirechte fehlen");
		}
	}

	/**
	 * @return true wenn der autoupdater vorhanden ist
	 */
	public static boolean istInstalliert() {

		if (localPath.exists()) {
			if (new KopierWerkzeug().getFileSize(localPath) >= 0) {
				return true;
			}
		}
		return false;
	}
}
